/** 
 * flattenArrays 多维数组扁平化方法
 * @param { Array }
 * @returns { Array }
 * 
*/
function flatten(arr = []) {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    };
    return arr;
}

// 遍历数组每一项，若值为数组则递归遍历，否则concat。
// reduce是数组的一种方法，它接收一个函数作为累加器，数组中的每个值（从左到右）开始缩减，最终计算为一个值。

// reduce包含两个参数：回调函数，传给total的初始值
// function flatten(arr) {  
//     return arr.reduce((result, item)=> {
//         return result.concat(Array.isArray(item) ? flatten(item) : item);
//     }, []);
// }

// // 求数组的各项值相加的和： 
// arr.reduce((total, item)=> {  // total为之前的计算结果，item为数组的各项值
//     return total + item;
// }, 0);


// 2.toString & split
// 调用数组的toString方法，将数组变为字符串然后再用split分割还原为数组
// 因为split分割后形成的数组的每一项值为字符串，所以需要用一个map方法遍历数组将其每一项转换为数值型
function flatten(arr = []) {
    // console.log(arr.toString());
    // console.log(arr.toString().split());
    return arr.toString().split(',').map(function (item) {
        return Number(item) == item ? Number(item) : item;
    })
}



// 3. join & split
// 和上面的toString一样，join也可以将数组转换为字符串

// function flatten(arr) {
//     return arr.join(',').split(',').map(function(item) {
//         return parseInt(item);
//     })
// }


// 4. 递归
// 递归的遍历每一项，若为数组则继续遍历，否则concat

// 复制代码
// function flatten(arr) {
//     var res = [];
//     arr.map(item => {
//         if (Array.isArray(item)) {
//             res = res.concat(flatten(item));
//         } else {
//             res.push(item);
//         }
//     });
//     return res;
// }

// 总结
// 虽然说写了5种方法，但是核心也只有一个：

// 遍历数组arr，若arr[i]为数组则递归遍历，直至arr[i]不为数组然后与之前的结果concat。 

let newArr = flatten([1, 2, 4, [56, 'yy', 'ytyt', 'uyu'], 4545,(i = 1)=>{console.log(i)}]);
console.log(newArr);
let str = newArr[newArr.length-1];
console.log( typeof str,str.length);
console.log( typeof str.substring(0,25))




// js中的map方法

// 1）定义：map方法是通过循环的方式一个一个项的处理原来的数组，并返回新的数组，同时，不会改变原数组的值

// 2）格式：array1.map(function(item, index, array1){}, [thisValue]);

// 3）参数解释：  

//      array1：要操作的原数组

//      item：当前数组循环操作到的项

//      index：当前数组循环操作到的项的序号

//      array1：当前操作的原始数组

//      thisValue：可选，如果指定前面function内部回调的this值=thisvalue。如果省略this=undefined

// 4）IE9以下不支持js的map方法

